home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -screenplay- / shareware / warpquake / warpquakesrc / sys_sun.c < prev    next >
C/C++ Source or Header  |  2000-02-29  |  7KB  |  353 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. // sys_sun.h -- Sun system driver
  21.  
  22. #include "quakedef.h"
  23. #include "errno.h"
  24. #include <sys/types.h>
  25. #include <sys/time.h>
  26. #include <sys/stat.h>
  27. #include <sys/mman.h>
  28. #include <sys/param.h>
  29. #include <fcntl.h>
  30. #include <stddef.h>
  31. #include <sys/types.h>
  32. #include <fcntl.h>
  33. #include <sys/mman.h>
  34. #include <stdio.h>
  35.  
  36. qboolean            isDedicated;
  37.  
  38. /*
  39. ===============================================================================
  40.  
  41. FILE IO
  42.  
  43. ===============================================================================
  44. */
  45.  
  46. #define MAX_HANDLES             10
  47.  
  48. typedef struct 
  49. {
  50.     FILE        *hFile;
  51.     char        *pMap;
  52.     int            nLen;
  53.     int            nPos;
  54. } MEMFILE;
  55.  
  56. MEMFILE            sys_handles[MAX_HANDLES];
  57.  
  58. int findhandle (void)
  59. {
  60.     int             i;
  61.     
  62.     for (i=1 ; i<MAX_HANDLES ; i++)
  63.         if (!sys_handles[i].hFile)
  64.             return i;
  65.     Sys_Error ("out of handles");
  66.     return -1;
  67. }
  68.  
  69. /*
  70. ================
  71. filelength
  72. ================
  73. */
  74. int filelength (FILE *f)
  75. {
  76.     int             pos;
  77.     int             end;
  78.  
  79.     pos = ftell (f);
  80.     fseek (f, 0, SEEK_END);
  81.     end = ftell (f);
  82.     fseek (f, pos, SEEK_SET);
  83.  
  84.     return end;
  85. }
  86.  
  87. int Sys_FileOpenRead (char *path, int *hndl)
  88. {
  89.     FILE    *f;
  90.     int             i;
  91.     
  92.     i = findhandle ();
  93.     
  94.     f = fopen(path, "rb");
  95.     if (!f)
  96.     {
  97.     *hndl = -1;
  98.     return -1;
  99.     }
  100.     sys_handles[i].hFile = f;
  101.     sys_handles[i].nLen = filelength(f);
  102.     sys_handles[i].nPos = 0;
  103.     sys_handles[i].pMap = mmap( 0, sys_handles[i].nLen, PROT_READ, MAP_SHARED, fileno( sys_handles[i].hFile ), 0 );
  104.     if (!sys_handles[i].pMap || (sys_handles[i].pMap == (char *)-1))
  105.     {
  106.     printf( "mmap %s failed!", path );
  107.     sys_handles[i].pMap = NULL;
  108.     }
  109.  
  110.     *hndl = i;
  111.     
  112.     return( sys_handles[i].nLen );
  113. }
  114.  
  115. int Sys_FileOpenWrite (char *path)
  116. {
  117.     FILE    *f;
  118.     int             i;
  119.     
  120.     i = findhandle ();
  121.  
  122.     f = fopen(path, "wb");
  123.     if (!f)
  124.     Sys_Error ("Error opening %s: %s", path,strerror(errno));
  125.     sys_handles[i].hFile = f;
  126.     sys_handles[i].nLen = 0;
  127.     sys_handles[i].nPos = 0;
  128.     sys_handles[i].pMap = NULL;
  129.     
  130.     return i;
  131. }
  132.  
  133. void Sys_FileClose (int handle)
  134. {
  135.     if (sys_handles[handle].pMap)
  136.     if (munmap( sys_handles[handle].pMap, sys_handles[handle].nLen ) != 0)
  137.         printf( "failed to unmap handle %d\n", handle );
  138.  
  139.     fclose (sys_handles[handle].hFile);
  140.     sys_handles[handle].hFile = NULL;
  141. }
  142.  
  143. void Sys_FileSeek (int handle, int position)
  144. {
  145.     if (sys_handles[handle].pMap)
  146.     {
  147.     sys_handles[handle].nPos = position;
  148.     }
  149.     else fseek (sys_handles[handle].hFile, position, SEEK_SET);
  150. }
  151.  
  152. int Sys_FileRead (int handle, void *dest, int count)
  153. {
  154.     if (sys_handles[handle].pMap)
  155.     {
  156.     int nPos = sys_handles[handle].nPos;
  157.     if (count < 0) count = 0;
  158.     if (nPos + count > sys_handles[handle].nLen)
  159.         count = sys_handles[handle].nLen - nPos;
  160.     memcpy( dest, &sys_handles[handle].pMap[nPos], count );
  161.     sys_handles[handle].nPos = nPos + count;
  162.     return( count );
  163.     }
  164.     else return fread (dest, 1, count, sys_handles[handle].hFile);
  165. }
  166.  
  167. int Sys_FileWrite (int handle, void *data, int count)
  168. {
  169.     if (sys_handles[handle].pMap)
  170.     Sys_Error( "Attempted to write to read-only file %d!\n", handle );
  171.     return fwrite (data, 1, count, sys_handles[handle].hFile);
  172. }
  173.  
  174. int Sys_FileTime (char *path)
  175. {
  176.     FILE    *f;
  177.     
  178.     f = fopen(path, "rb");
  179.     if (f)
  180.     {
  181.     fclose(f);
  182.     return 1;
  183.     }
  184.     
  185.     return -1;
  186. }
  187.  
  188. void Sys_mkdir (char *path)
  189. {
  190.     mkdir( path, 0777 );
  191. }
  192.  
  193. /*
  194. ===============================================================================
  195.  
  196. SYSTEM IO
  197.  
  198. ===============================================================================
  199. */
  200.  
  201. void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length)
  202. {
  203.  
  204.     int r;
  205.     unsigned long addr;
  206.     int psize = getpagesize();
  207.  
  208.     addr = (startaddr & ~(psize-1)) - psize;
  209.  
  210. //    fprintf(stderr, "writable code %lx(%lx)-%lx, length=%lx\n", startaddr,
  211. //            addr, startaddr+length, length);
  212.  
  213.     r = mprotect((char*)addr, length + startaddr - addr + psize, 7);
  214.  
  215.     if (r < 0)
  216.             Sys_Error("Protection change failed\n");
  217.  
  218. }
  219.  
  220.  
  221. void Sys_Error (char *error, ...)
  222. {
  223.     va_list         argptr;
  224.  
  225.     printf ("Sys_Error: ");   
  226.     va_start (argptr,error);
  227.     vprintf (error,argptr);
  228.     va_end (argptr);
  229.     printf ("\n");
  230.     Host_Shutdown();
  231.     exit (1);
  232. }
  233.  
  234. void Sys_Printf (char *fmt, ...)
  235. {
  236.     va_list         argptr;
  237.     
  238.     va_start (argptr,fmt);
  239.     vprintf (fmt,argptr);
  240.     va_end (argptr);
  241. }
  242.  
  243. void Sys_Quit (void)
  244. {
  245.     Host_Shutdown();
  246.     exit (0);
  247. }
  248.  
  249. double Sys_FloatTime (void)
  250. {
  251.     struct timeval tp;
  252.     struct timezone tzp; 
  253.     static int      secbase; 
  254.     
  255.     gettimeofday(&tp, &tzp);  
  256.  
  257.     if (!secbase)
  258.     {
  259.         secbase = tp.tv_sec;
  260.         return tp.tv_usec/1000000.0;
  261.     }
  262.  
  263.     return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0;
  264. }
  265.  
  266. char *Sys_ConsoleInput (void)
  267. {
  268.     static char    text[256];
  269.     int        len;
  270.     fd_set    readfds;
  271.     int        ready;
  272.     struct timeval timeout;
  273.     
  274.     timeout.tv_sec = 0;
  275.     timeout.tv_usec = 0;
  276.     FD_ZERO(&readfds);
  277.     FD_SET(0, &readfds);
  278.     ready = select(1, &readfds, 0, 0, &timeout);
  279.     
  280.     if (ready>0)
  281.     {
  282.     len = read (0, text, sizeof(text));
  283.     if (len >= 1)
  284.     {
  285.         text[len-1] = 0;    // rip off the /n and terminate
  286.         return text;
  287.     }
  288.     }
  289.     
  290.     return 0;
  291. }
  292.  
  293. void Sys_Sleep (void)
  294. {
  295. }
  296.  
  297. #if !id386
  298. void Sys_HighFPPrecision (void)
  299. {
  300. }
  301.  
  302. void Sys_LowFPPrecision (void)
  303. {
  304. }
  305. #endif
  306.  
  307. void Sys_Init(void)
  308. {
  309. #if id386
  310.     Sys_SetFPCW();
  311. #endif
  312. }
  313.  
  314. //=============================================================================
  315.  
  316. int main (int argc, char **argv)
  317. {
  318.     static quakeparms_t    parms;
  319.     float time, oldtime, newtime;
  320.     
  321.     parms.memsize = 16*1024*1024;
  322.     parms.membase = malloc (parms.memsize);
  323.     parms.basedir = ".";
  324.     parms.cachedir = NULL;
  325.  
  326.     COM_InitArgv (argc, argv);
  327.  
  328.     parms.argc = com_argc;
  329.     parms.argv = com_argv;
  330.  
  331.     printf ("Host_Init\n");
  332.     Host_Init (&parms);
  333.  
  334.     Sys_Init();
  335.  
  336.     // unroll the simulation loop to give the video side a chance to see _vid_default_mode
  337.     Host_Frame( 0.1 );
  338.     VID_SetDefaultMode();
  339.  
  340.     oldtime = Sys_FloatTime();
  341.     while (1)
  342.     {
  343.         newtime = Sys_FloatTime();
  344.         Host_Frame (newtime - oldtime);
  345.         oldtime = newtime;
  346.     }
  347.     return 0;
  348. }
  349.  
  350.  
  351.  
  352.  
  353.